//
//  YXMainTabBarController.swift
//  SinaWeiBo
//
//  Created by Vergil on 2017/4/5.
//  Copyright © 2017年 Vergil. All rights reserved.
//

import UIKit
import SVProgressHUD

class YXMainTabBarController: UITabBarController {

    //进过测试 fileprivate作用范围是当前源文件,但是不能修饰方法,如果修饰方法则作用域为当前{}
    //private作用范围是当前{}
    //internal是默认修饰符
    
    fileprivate var timer: Timer?
    
    override func viewDidLoad() {
        super.viewDidLoad()

        setUpChildController()
        setUpComposeBtn()
        setUpTimer()
        delegate = self
        
        //注册接收通知
        NotificationCenter.default.addObserver(self, selector: #selector(userLogin), name: NSNotification.Name(rawValue: WBUserLoginNotification), object: nil)
    }
    
    fileprivate lazy var composeBtn = UIButton()
    
    deinit {
        //销毁定时器
        timer?.invalidate()
        //注销通知
        NotificationCenter.default.removeObserver(self)
    }
    
    //MARK: - 监听方法
    @objc private func userLogin(n: Notification) {
        print("----\(n)")
        
        var when = DispatchTime.now()
        
        if n.object != nil {
            
            when = DispatchTime.now() + 2
            
            //设置hud显示样式
            SVProgressHUD.setDefaultMaskType(.black)
            SVProgressHUD.showInfo(withStatus: "用户授权已过期,请重新登录")
            
        }
        
        //延时加载
        DispatchQueue.main.asyncAfter(deadline: when) { 
        
            SVProgressHUD.setDefaultMaskType(.none)
            let nav = UINavigationController(rootViewController: YXAouthViewController())
            self.present(nav, animated: true, completion: nil)
            
        }
        
    }
    
    func composeBtnClick() {
        
        //测试横屏
        let vc = UIViewController()
        
        let nav = UINavigationController(rootViewController: vc)
        
        present(nav, animated: true, completion: nil)
        
    }
    
    //使用代码控制横竖屏,就可以在需要横屏的时候单独处理
    //设置支持的方向之后,当前控制器和他的子控制器都会遵循这个方向
    //如果播放视频,一般都是通过modal的方式实现的
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .portrait
    }
    
}

// MARK: - UITabBarControllerDelegate代理方法
extension YXMainTabBarController:UITabBarControllerDelegate {
    
    /// 即将跳转到目标控制器
    ///
    /// - Parameters:
    ///   - tabBarController: tabBarController
    ///   - viewController: 目标控制器
    /// - Returns: 返回值,是否跳转
    func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
        
        print("目标控制器 \(viewController)")
        
        /**
         一剑破军 两三点 四野间 五行歼六环绕了却七魄衍
         八卦棋演 九宫怨 十方念 百转千万丈远红尘问侯爵
         是非问尘远 过万千 转瞬年 方士怨
         樽酒误期延 伊人何止剩几愁勉
         御剑飞鸿 战不休 破苍穹 引星留莫言刀剑挥影无穷
         长生不老 筑基始 仙魔终 谁何求金丹修高却在寒楼
         气聚丹田 经年不朽 问道缘 元婴变
         功成天道倦 深庭院伊人坠阴间
         魑魅魍魉一剑破万法
         尤记伊与君执手天涯
         管他仇满天下 江山亦如画
         一樽酒饮罢 从此不负她
         镜中月 水中花 待君踏
         十殿前君来闯 挽君走一场
         不让柔情枯芳华
         深宫院 虹桥前 莲池浅 芙蓉面
         长生远 不如怜 眼年前 共枕眠
         携美闲 提刀灭 仇万千 心无涟
         画眉间 柔情显 不厌世 过经年
         陪君诉青天
         抚琴唱 今夕是何年
         伴笛声 古亭闻铃浅
         拥伊人 长生无你怎成仙
         地狱再无你名笺 亦成仙
         魑魅魍魉一剑破万法
         尤记伊与君执手天涯
         管他仇满天下 江山亦如画
         一樽酒饮罢 从此不负她
         镜中月 水中花 待君踏
         十殿前君来闯 挽君走一场
         魑魅魍魉一剑破万法
         尤记伊与君执手天涯
         管他仇满天下 江山亦如画
         一樽酒饮罢 从此不负她
         镜中月 水中花 待君踏
         十殿前君来闯 挽君走一场
         不让柔情枯芳华
         */
        
        //1>获取控制器在数组中的索引
        let index = (childViewControllers as NSArray).index(of: viewController)
        //2>判断当前索引是否是首页并且跳转控制器索引是否也为首页
        if selectedIndex == 0 && index == selectedIndex {
            
            print("再次点击首页")
            //滑动到最顶部并进行刷新数据
            let nav = childViewControllers[index] as! YXMainNavController
            let mainV = nav.childViewControllers[0] as! YXMainViewController
            mainV.tableView?.setContentOffset(CGPoint(x: 0, y: -64), animated: true)
            //刷新数据
            DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1, execute: {
                mainV.loadData()
            })
            
        }
        
        //利用代理解决中间按钮容错点问题
        return !viewController.isMember(of: UIViewController.self)
    }
}

// MARK: - 时钟相关方法
extension YXMainTabBarController {
    
    /// 设置时钟
    func setUpTimer() {
        
        timer = Timer.scheduledTimer(timeInterval: 40.0, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
        
    }
    
    @objc func updateTime() {
        
        if !YXNetWork.Manager.userLogin {
            return
        }
        
        print("时钟刷新一下数据")
        YXNetWork.Manager.getUnreadCount { (count) in
            
            //设置tabbar的badgenumber
            self.tabBar.items?[0].badgeValue = count > 0 ? "\(count)" : nil
            print("未读数据有\(count)")
            //设置app的badgenumber,从ios8之后显示badgenum都需要用户授权
            UIApplication.shared.applicationIconBadgeNumber = count
            
        }
    }
    
}

//MARK: - extension
// extension 类似于oc中的category,在swift中还可以用来分割代码块
// 可以把相近功能的函数放在一起,便于代码维护
//注意: 和oc中的category一样不能定义属性,只能定义方法
extension YXMainTabBarController {
    
    fileprivate func setUpComposeBtn() {
        
        tabBar.addSubview(composeBtn)
        composeBtn.setBackgroundImage(UIImage(named: "tabbar_compose_button"), for: .normal)
        composeBtn.setBackgroundImage(UIImage(named: "tabbar_compose_button_highlighted"), for: .highlighted)
        composeBtn.setImage(UIImage(named: "tabbar_compose_icon_add"), for: .normal)
        composeBtn.setImage(UIImage(named: "tabbar_compose_icon_add_highlighted"), for: .highlighted)
        
        //按钮宽度
        let w = tabBar.bounds.width / CGFloat(childViewControllers.count)
        
        composeBtn.frame = tabBar.bounds.insetBy(dx: w * 2, dy: 0)
        
        composeBtn.addTarget(self, action: #selector(composeBtnClick), for: .touchUpInside)
        
    }
    
    //设置所有子控制器
    // internal 安全性比 private 低一点,但作用范围高一点,只能本类调用,而private只能当前{}内调用
    fileprivate func setUpChildController() {
        
        //先从沙盒获取数据,如果没有再加载本地数据
        let dirDic = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
        let jsonPath = (dirDic as NSString).appendingPathComponent("main.json")
        
        var data = NSData(contentsOfFile: jsonPath)
        
        if data == nil {
            
            let path = Bundle.main.path(forResource: "main.json", ofType: nil)
            data = NSData(contentsOfFile: path!)
            
        }
        
        //如果没登录,加载本地默认json文件
        guard let dicAry = try? JSONSerialization.jsonObject(with: data! as Data, options: []) as? [[String : Any]] else {
            return
        }
        
//        let dicAry = [
//            ["clsName":"YXHomeViewController","titleN":"首页","imageName":"home",
//             "visitorInfo" : ["imageName" : "","message" : "关注一些人,回这里看看会有什么惊喜"]],
//            ["clsName":"YXMessageViewController","titleN":"消息","imageName":"message_center",
//             "visitorInfo" : ["imageName" : "visitordiscover_image_message","message" : "消息界面"]],
//            ["clsName":"UIViewController"],
//            ["clsName":"YXDiscoverViewController","titleN":"发现","imageName":"discover",
//             "visitorInfo" : ["imageName" : "visitordiscover_image_message","message" : "发现界面"]],
//            ["clsName":"YXMeViewController","titleN":"我","imageName":"profile",
//             "visitorInfo" : ["imageName" : "visitordiscover_image_profile","message" : "个人界面"]],
//        ]
        
        //保存本地plist格式
//        (dicAry as? NSArray)?.write(toFile: "/Users/useeinfo/Desktop/test.plist", atomically: true)
        
        //保存本地json格式
//        let data = try! JSONSerialization.data(withJSONObject: dicAry, options: .prettyPrinted)
//        (data as NSData).write(toFile: "/Users/useeinfo/Desktop/main.json", atomically: true)
        
        var vcArray = [UIViewController]()
        
        for dic in dicAry! {
            
            let vc = setUpOneChildController(dic: dic)
            
            vcArray.append(vc)
            
        }
        
        viewControllers = vcArray
        
    }
    
    //使用字典创建一个子控制器
    private func setUpOneChildController(dic: [String : Any]) -> UIViewController {
        
        guard let clsName = dic["clsName"] as? String,
        let titleN = dic["titleN"] as? String,
        let imageName = dic["imageName"] as? String,
        let cls = NSClassFromString(Bundle.main.appName + "." + clsName) as? YXMainViewController.Type,
        let visitorInfo = dic["visitorInfo"] as? [String: String] else {
            return UIViewController()
        }
        
        //初始化控制器
        let vc = cls.init()
        //设置tabBarItem图片和标题
        vc.title = titleN
        vc.tabBarItem.image = UIImage(named: "tabbar_" + imageName)
        vc.tabBarItem.selectedImage = UIImage(named: "tabbar_" + imageName + "_selected")?.withRenderingMode(UIImageRenderingMode.alwaysOriginal)
        //设置tabBarItem文字属性
        vc.tabBarItem.setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.orange],
                                             for: .selected)
        //默认字体大小12,如果要修改字体大小必须在normal状态下设置
//        vc.tabBarItem.setTitleTextAttributes([NSFontAttributeName:UIFont.systemFont(ofSize: 12)],
//                                             for: .normal)
        vc.visitViewInfo = visitorInfo
        
        let nav = YXMainNavController(rootViewController: vc)
 
        return nav
        
    }
    
}

